package com.Cychat.AI.service;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.net.URL;
import java.util.*;

@Service
public class AIService {
    @Value("${spring.ai.dashscope.api-key}")
    private String dashscopeApiKey; // 仅保留必要配置

    /**
     * 合并处理：单图/多图识别（一个方法适配所有数量）
     * @param question 用户问题（用于指导识别方向）
     * @param ossImageUrls 前端传的OSS图片URL列表（1张或多张）
     * @return 所有图片的合并描述（格式：第1张图：xxx\n第2张图：xxx...）
     */
    public Flux<String> processImages(String question, List<String> ossImageUrls) {
        // 1. 空校验：无图片时返回空描述（不阻断后续流程）
        if (ossImageUrls == null || ossImageUrls.isEmpty()) {
            return Flux.just("");
        }

        // 2. 统一处理：将每张图片的识别逻辑封装为Flux，最后合并结果
        List<Flux<String>> singleImageDescFluxList = new ArrayList<>();
        for (int i = 0; i < ossImageUrls.size(); i++) {
            int imgIndex = i + 1; // 图片序号（用于描述区分，如“第1张图”）
            String currentOssUrl = ossImageUrls.get(i); // 当前图片的OSS URL

            // 3. 单张图片识别逻辑（循环生成，适配多图）
            Flux<String> singleImgDesc = Flux.defer(() -> {
                try {
                    // 构建多模态请求（通义千问VL模型）
                    MultiModalConversation conv = new MultiModalConversation();
                    Map<String, Object> imageConfig = new HashMap<>();
                    imageConfig.put("image", currentOssUrl); // 直接用前端OSS URL
                    imageConfig.put("max_pixels", "6422528"); // 保留像素配置
                    imageConfig.put("min_pixels", "3136");
                    imageConfig.put("enable_rotate", true);

                    // 构建用户消息：用序号区分图片，让描述更清晰
                    MultiModalMessage userMsg = MultiModalMessage.builder()
                            .role(Role.USER.getValue())
                            .content(Arrays.asList(
                                    imageConfig,
                                    Collections.singletonMap("text",
                                            "请识别第" + imgIndex + "张图片：" +
                                                    "1. 提取核心内容（如物体、场景、文字）；" +
                                                    "2. 结合用户问题[" + question + "]补充关键信息；" +
                                                    "3. 描述简洁，不超过50字。"
                                    )
                            ))
                            .build();

                    // 调用多模态接口
                    MultiModalConversationParam param = MultiModalConversationParam.builder()
                            .apiKey(dashscopeApiKey)
                            .model("qwen-vl-ocr-latest") // OCR+图文识别模型
                            .message(userMsg)
                            .build();
                    MultiModalConversationResult result = conv.call(param);

                    // 4. 解析单张图片的识别结果
                    String imgDesc = "第" + imgIndex + "张图：";
                    if (result.getOutput() != null
                            && result.getOutput().getChoices() != null
                            && !result.getOutput().getChoices().isEmpty()) {
                        Object contentObj = result.getOutput().getChoices().get(0).getMessage().getContent();
                        if (contentObj instanceof List) {
                            for (Object item : (List<?>) contentObj) {
                                if (item instanceof Map && ((Map<?, ?>) item).containsKey("text")) {
                                    imgDesc += ((Map<?, ?>) item).get("text").toString();
                                    break;
                                }
                            }
                        }
                    }
                    // 识别失败时的默认描述
                    return Flux.just(imgDesc.isEmpty() ? "第" + imgIndex + "张图：未识别到有效内容" : imgDesc);

                } catch (Exception e) {
                    // 单张图识别失败不影响其他图，返回错误提示
                    return Flux.just("第" + imgIndex + "张图：识别失败（" + e.getMessage().substring(0, 30) + "）");
                }
            });

            singleImageDescFluxList.add(singleImgDesc); // 收集每张图的识别Flux
        }

        // 5. 合并所有图片的描述（按顺序拼接，用换行分隔）
        return Flux.mergeSequential(singleImageDescFluxList) // 按图片序号顺序合并
                .collectList() // 转为列表
                .flatMapMany(descList -> Flux.just(String.join("\n", descList))); // 用“\n”拼接成完整描述
    }
}